/**
 * @type {Number}
 *
 * @properties={typeid:35,uuid:"4F79C6B7-F9EE-40E7-B67D-F456EC9560C2",variableType:4}
 */
var fanio = null;

/**
 * @type {Number}
 *
 * @properties={typeid:35,uuid:"86A384EA-AF4D-4D63-BF39-4309E714C6F1",variableType:4}
 */
var fasiento = null;

/**
 * @type {Number}
 *
 * @properties={typeid:35,uuid:"ECD84D65-0E88-4914-AFC9-F1799504EB97",variableType:8}
 */
var fdolar_debe = null;

/**
 * @type {Number}
 *
 * @properties={typeid:35,uuid:"C51AE91E-C1D5-483D-8028-72B1C297FCCC",variableType:8}
 */
var fdolar_haber = null;

/**
 * @type {Number}
 *
 * @properties={typeid:35,uuid:"C8B81566-F961-482C-AC50-E11671B70434",variableType:4}
 */
var fmes = null;

/**
 * @type {Number}
 *
 * @properties={typeid:35,uuid:"75A82527-D474-4018-95C0-38A54B4AD3B7",variableType:4}
 */
var fmue1 = null;

/**
 * @type {Number}
 *
 * @properties={typeid:35,uuid:"A2843117-A954-403C-9328-401F0DB8FC5F",variableType:4}
 */
var fmue2 = null;

/**
 * @type {Number}
 *
 * @properties={typeid:35,uuid:"A547A815-E6D4-4A4E-AD56-BBADD52C1125",variableType:8}
 */
var ftotal_debe = null;

/**
 * @type {Number}
 *
 * @properties={typeid:35,uuid:"A5A3B49B-6A86-4E04-B697-A4420119D90D",variableType:8}
 */
var ftotal_haber = null;

/**
 * Callback method for when form is shown.
 *
 * @param {Boolean} [firstShow] form is shown first time after load
 * @param {JSEvent} [event] the event that triggered the action
 *
 * @properties={typeid:24,uuid:"FA81BE26-D50B-4FC8-B75C-53125E3A6294"}
 */
function onShow(firstShow, event) {
	fmes 	= 0
	fanio 	= 0
	if (controller.getMaxRecordIndex() == 0)
	{
		var $hoy 	= application.getServerTimeStamp()
		fmes 		= $hoy.getMonth() + 1
		fanio 		= $hoy.getFullYear()
	}
	else
	{
		controller.sort("anio desc, mes desc")
		fmes 	= mes + 1
		fanio 	= anio
		if (fmes == 13)
		{
			fmes 	= 1
			fanio 	= anio + 1 
		}
	}
	var $fecha = new Date(fanio, fmes -1, 1, 0,0,0,0)
	if ($fecha < gejercicio_to_ejercicios.fecha_inicio || $fecha > gejercicio_to_ejercicios.fecha_fin)
	{
		fanio 	= null
		fmes 	= null
		elements.H.visible = false
	}
	else
	{
		elements.H.visible = true
	}
	globals.gvarios = 6	
	elements.btn_imprimir.visible = false
	databaseManager.setAutoSave(false)
}

/**
 * Perform the element default action.
 *
 * @param {JSEvent} event the event that triggered the action
 *
 * @properties={typeid:24,uuid:"9933F93F-741B-4116-989D-A1645DBDC927"}
 * @AllowToRunInFind
 */
function onAction_habilita(event) {

	controller.newRecord()
	anio 			= fanio
	mes 			= fmes
	asiento 		= 1
	empresa			= globals.gUservID
	limbo 			= 1
	marca_cierre 	= 0
	var estado = databaseManager.saveData()
	if (estado == false)
	{
		globals.DIALOGS.showWarningDialog("Error","No se actualizaron los datos","Ok")
		databaseManager.revertEditedRecords()
		return
	}
 	onShow()
}

/**
 * Perform the element default action.
 *
 * @param {JSEvent} event the event that triggered the action
 *
 * @properties={typeid:24,uuid:"E8229B6F-EE99-47FA-9A53-04A528E6A927"}
 * @AllowToRunInFind
 */
function onAction_verificar(event) {
	if (marca_cierre == 1)
	{
		globals.DIALOGS.showWarningDialog("Aviso","Mes cerrado - no se verifica","Ok")
		return
    }
	var res = globals.DIALOGS.showQuestionDialog('','Verifica los Asientos?','SI','NO')    	
	if (res == 'SI')
	{
		/** @type {JSFoundSet<db:/contable/asiento>}*/
		var fs_asiento = databaseManager.getFoundSet("contable","asiento")
  		var estado = fs_asiento.find()
		if (estado == false)
		{
			globals.DIALOGS.showWarningDialog("Error","Error al hacer el Find","Ok")
			return
		}
		fs_asiento.anio  = anio
		fs_asiento.mes   = mes	
		fs_asiento.search() 
		fmue1 = databaseManager.getFoundSetCount(fs_asiento)
		fs_asiento.sort("asiento_cab_id asc")
		var $errores = databaseManager.createEmptyDataSet(0,['asiento_id','error'])
		for (var i = 1 ; i <= fmue1 ; i++)
		{
			fs_asiento.setSelectedIndex(i)
			if (i == 1)
			{
				fasiento     = fs_asiento.asiento_cab_id
				var fnumero  = fs_asiento.numero
				ftotal_debe  = 0
				ftotal_haber = 0
				fdolar_debe  = 0
				fdolar_haber = 0
			}
			if (fs_asiento.asiento_to_division.getSize() == 0)
			{
				$errores.addRow([fs_asiento.numero,'No ubica la division = '+fs_asiento.division])	
			}
			if (fs_asiento.asiento_to_centro.getSize() == 0)
			{
				$errores.addRow([fs_asiento.numero,'No ubica el centro = '+fs_asiento.centro])		
			}
			if (fs_asiento.asiento_to_cuentas.getSize() == 0)
			{
				$errores.addRow([fs_asiento.numero,'No ubica la cuenta = '+fs_asiento.cuentas_id]) 			
			}
			if (fs_asiento.impodol == null)
			{
				fs_asiento.impodol = 0
			}
			if (fs_asiento.importe == null)
			{
				fs_asiento.importe = 0
			}
			if (fasiento == fs_asiento.asiento_cab_id)
			{
				if (fs_asiento.columna == "D")
				{
					ftotal_debe += fs_asiento.importe
					fdolar_debe += fs_asiento.impodol
				}
				else
				{
					ftotal_haber += fs_asiento.importe
					fdolar_haber += fs_asiento.impodol				
				}
			}
			else
			{
				if (utils.numberFormat(ftotal_debe,2) != utils.numberFormat(ftotal_haber,2) || utils.numberFormat(fdolar_debe,2) != utils.numberFormat(fdolar_haber,2))
				{
					$errores.addRow([fnumero,'El asiento no balancea']) 	
				}
				fasiento = fs_asiento.asiento_cab_id
				fnumero  = fs_asiento.numero
				if (fs_asiento.columna == "D")
				{
					ftotal_debe  = fs_asiento.importe
					fdolar_debe  = fs_asiento.impodol
					ftotal_haber = 0
					fdolar_haber = 0
				}
				else
				{
					ftotal_haber = fs_asiento.importe
					fdolar_haber = fs_asiento.impodol
					ftotal_debe  = 0
					fdolar_debe  = 0
				} 
			} 		
		}
		elements.tabs_errores.removeAllTabs()
		if ($errores.getMaxRowIndex() > 0)
		{
			var $tipos   = new Array (JSColumn.INTEGER,JSColumn.TEXT)
			var $titulos = new Array ('Asiento','Descripcion')
			var $titulo  = 'Errores '+ mes + '/' + anio
			crearFormErrores($errores,$tipos,$titulos,$titulo)
			elements.btn_imprimir.visible = true
		}
		else
		{
			elements.btn_imprimir.visible = false
			//globals.DIALOGS.showInfoDialog('Aviso','Asientos sin errores, se procede al calculo de los saldos','Ok')
			/*var params = {
		         processFunction: RecalcularSaldos,
		         message: 'Generando Saldos...', 
		         opacity: 0.02,
		         paneColor: '#000000',
		         textColor: '#ffffff',
		         showCancelButton: false
			};*/
			try
			{
				//plugins.busy.block( params );
				RecalcularSaldos()
			}
			catch(e)
			{
				globals.DIALOGS.showWarningDialog('Aviso','Ocurrió un error inesperado : '+ e,'OK')
			}
			//RecalcularSaldos()
		}	
    }
}

/**
 * Perform the element default action.
 *
 * @param {JSEvent} event the event that triggered the action
 *
 * @properties={typeid:24,uuid:"3640CB29-363E-4EA5-8CA3-BDC8ACC11C5A"}
 * @AllowToRunInFind
 */
function onAction_cerrar(event) {
	var $mes_ant 	= mes - 1
	var $anio_ant 	= anio
	if ($mes_ant == 0)
	{
		$mes_ant = 12
		$anio_ant--
	}
	var $sql 	= 'SELECT '+ 
						'marca_cierre '+ 
					'FROM numcon '+
					'WHERE '+
						'anio = ? AND '+
						'mes = ? AND '+
						'ejercicio_id = ?'
	var $args 	= [$anio_ant, $mes_ant, globals.gEjercicio]
	var $ds 	= databaseManager.getDataSetByQuery('contable',$sql,$args,1)
	if ($ds.getMaxRowIndex() == 1)
	{
		if ($ds.getValue(1,1) == 0)
		{
			globals.DIALOGS.showWarningDialog("Aviso","Debe cerrar el mes anterior","Ok")
			return
		}
	}
	globals.DIALOGS.showWarningDialog("Aviso","Recuerde Verificar el mes antes de Cerrar","Ok")
 	var res = globals.DIALOGS.showQuestionDialog('','Procede con el cierre del mes?','SI','NO')    	
	if (res == 'SI')
	{
		databaseManager.setAutoSave(false)
		/** @type {JSFoundSet<db:/contable/asiento_cab>}*/
		var fs_asiento = databaseManager.getFoundSet("contable","asiento_cab")
		
// primero tomo solo los asientos que no son dolares		
  		var estado = fs_asiento.find()
		if (estado == false)
		{
			globals.DIALOGS.showWarningDialog("Aviso","Error al hacer el Find","Ok")
			return
		}
		fs_asiento.anio  	= anio
		fs_asiento.mes   	= mes
		fs_asiento.moneda  	= "!=D"		
		fs_asiento.search() 		
		fmue1 = databaseManager.getFoundSetCount(fs_asiento)
		fs_asiento.sort("fs_asiento.fecha asc")
		for (var i = 1 ; i <=fmue1 ; i++)
		{
			fs_asiento.setSelectedIndex(i)
			fs_asiento.provisorio = fs_asiento.numero
			fs_asiento.numero = i
		}	
	
// ahora los asientos que son dolares
  		var estado = fs_asiento.find()
		if (estado == false)
		{
			globals.DIALOGS.showWarningDialog("Aviso","Error al hacer el Find","Ok")
			return
		}
		fs_asiento.anio  	= anio
		fs_asiento.mes   	= mes
		fs_asiento.moneda  	= "D"		
		fs_asiento.search() 		
		fmue2 = databaseManager.getFoundSetCount(fs_asiento)
		fs_asiento.sort("fs_asiento.fecha asc")
		for (var i = 1 ; i <= fmue2 ; i++)
		{
			fs_asiento.setSelectedIndex(i)
			fs_asiento.provisorio = fs_asiento.numero
			fs_asiento.numero = fmue1 + i
		} 
		
		var estado = databaseManager.saveData()
		if (estado == false)
		{
			globals.DIALOGS.showWarningDialog("Aviso","No se actualizaron los datos","Ok")
			databaseManager.revertEditedRecords()
			return
		}	
		globals.DIALOGS.showInfoDialog("Aviso","Mes Cerrado exitosamente","Ok")
		databaseManager.setAutoSave(true)
	}
}

/**
 * Perform the element default action.
 *
 * @param {JSEvent} event the event that triggered the action
 *
 * @properties={typeid:24,uuid:"2827CC96-1F6E-423A-A9A2-F18480C11F01"}
 */
function onAction_imp_errores(event) {
	forms['errores_asientos'].controller.showPrintPreview()
}

/**
 * @properties={typeid:24,uuid:"AC8170E4-2D4D-48DB-8653-5C47902DBF47"}
 */
function crearFormErrores(ds,tipos,titulos,titulo) {
	var $nombre = 'errores_asientos'
	history.removeForm($nombre)
	solutionModel.removeForm($nombre)
	if ((ds != null) && (tipos != null))
	{
		//Creo un datasource necesario para crear un form 
		var data = ds.createDataSource('errores',tipos)
		//Creo un form basico
		var frm = solutionModel.newForm( $nombre,  data,  null, false,  300, 60)
		//Le pongo que sea en forma de tabla
		frm.view = JSForm.LOCKED_TABLE_VIEW
		var x = 0
		//Por cada columna en el dataset creo un campo asociado
		for (var i = 1; i<=ds.getMaxColumnIndex(); i++)
		{
			var f = frm.newField(ds.getColumnName(i),JSField.TEXT_FIELD,x,41,100,20)
			//f.titleText = '+/-'// titulos[i-1]
			f.editable = false
			if ((tipos [i-1] == JSColumn.INTEGER) || (tipos [i-1] == JSColumn.NUMBER))
			{
				if (tipos [i-1] == JSColumn.INTEGER)
					f.width = 80
				else
					f.format = '###.###.###.###.###,00'
				f.horizontalAlignment = SM_ALIGNMENT.RIGHT
			}
			else
				if (tipos [i-1] == JSColumn.TEXT)
					f.width = 300
				else
				{
					f.width = 60
					f.format = 'dd-MM-yyyy'
				}
			f.anchors = SM_ANCHOR.EAST | SM_ANCHOR.WEST
			if (titulos == null)
				var title = ds.getColumnName(i)
			else
				var title = titulos[i-1]	
			var l = frm.newLabel(title,x,20,f.width,20)
			l.transparent = true			
			x+= f.width 
		}
		
		if (titulo != null)
		{
			frm.newTitleHeaderPart(40)
			var lbl = frm.newLabel(titulo,100,0,200,20)
			lbl.fontType = 'Tahoma,bold,14'
			lbl.transparent = true
		}
	}	
	elements.tabs_errores.addTab(forms[$nombre])
}

/**
 * Handle record selected.
 *
 * @param {JSEvent} event the event that triggered the action
 *
 * @properties={typeid:24,uuid:"73336489-A5D8-481B-87F6-93783142EBFC"}
 */
function onRecordSelection(event) {
	elements.btn_imprimir.visible = false
	elements.tabs_errores.removeAllTabs()
}

/**
 * @properties={typeid:24,uuid:"5FCF813D-1276-4493-AEB8-77C59837D141"}
 * @AllowToRunInFind
 */
function RecalcularSaldos() {
	try {	
		var panio = anio
		var pmes = mes
		
		databaseManager.setAutoSave(false)
		/** @type {JSFoundSet<db:/contable/saldos>}*/
		var fs_saldos = databaseManager.getFoundSet("contable","saldos")
		var estado = fs_saldos.find()
		if (estado == false)
		{
			globals.DIALOGS.showWarningDialog("Aviso","Error al hacer el Find","Ok")
			//plugins.busy.unblock();
			return
		}
		fs_saldos.anio  = panio
		fs_saldos.mes   = pmes	
		var cuantos = fs_saldos.search() 
		if (cuantos == 0)
		{
			globals.DIALOGS.showWarningDialog("Aviso","No ubica Saldos","Ok")
			//plugins.busy.unblock();
			return
		} 		
		var res = fs_saldos.deleteAllRecords()	  
     	if (res == false)
		{
			globals.DIALOGS.showWarningDialog("Aviso","No Limpia Saldos","Ok")
			//plugins.busy.unblock();
			return
		} 		
		var fs_asiento = databaseManager.getFoundSet("contable","asiento")
		var estado = fs_asiento.find()
		if (estado == false)
		{
			globals.DIALOGS.showWarningDialog("Aviso","Error al hacer el Find","Ok")
			//plugins.busy.unblock();
			return
		}
		fs_asiento.anio  = panio
		fs_asiento.mes   = pmes	
		fs_asiento.search() 
		fmue1 = databaseManager.getFoundSetCount(fs_asiento)
		//fs_asiento.sort("fs_asiento.asiento_cab_id asc")
		for (var i = 1 ; i <= fmue1 ; i++)
		{
			fs_asiento.setSelectedIndex(i)
			globals.gactualiza_saldos(fs_asiento)
		}
	    var panio = anio
	    var pmes  = mes
		var estado = databaseManager.saveData()
		if (estado == false)
		{
			databaseManager.revertEditedRecords()
			databaseManager.setAutoSave(true)
			//plugins.busy.unblock();
			globals.DIALOGS.showWarningDialog("Aviso","No se actualizaron los datos","Ok")
			return
		}
		//plugins.busy.unblock();
	    globals.DIALOGS.showInfoDialog("Aviso","Proceso finalizado con exito","Ok")
		databaseManager.setAutoSave(true)	
	} catch (e) {		
		//por si ocurre un error en el medio del proceso
		databaseManager.revertEditedRecords()
		databaseManager.setAutoSave(true)
		//plugins.busy.unblock();
		globals.DIALOGS.showWarningDialog("Aviso","No se actualizaron los datos","Ok")
		return
	}
}

/**
 * Handle hide window.
 *
 * @param {JSEvent} event the event that triggered the action
 *
 * @returns {Boolean}
 *
 * @properties={typeid:24,uuid:"9B397EE4-B24B-43CB-A85F-CE2E01B04298"}
 */
function onHide(event) {
	databaseManager.revertEditedRecords()
	databaseManager.setAutoSave(true)
	return true
}
